#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 1e5 + 5;

int n;
vector<int> ad[maxn];
int wei[maxn];
int dp[maxn]; // 该节点的权值路径值

void dfs(int u, int p, int w){
	dp[u] = w;
	for (int to:ad[u]) {
		if (to==p) {
			continue;
		}
		dfs(to, u, w+wei[to]);
	}
}


void solve(){
	cin >> n;
	for (int i=1;i<n;i++) {
		int a, b;
		cin >>a>>b;
		ad[a].push_back(b);
		ad[b].push_back(a);
	}
	
	for (int i=1;i<=n;i++) {
		cin >> wei[i];
	}

	
	dfs(1, 0, wei[1]);
	
	
	int mx=0;
	int pos=0;
	for (int i=1;i<=n;i++) {
		if (dp[i]>mx) {
			mx=dp[i];
			pos=i;
		}
	}
	
	dfs(pos, 0, wei[pos]);
	
	mx=0;
	for (int i=1;i<=n;i++) {
		mx=max(mx, dp[i]);
	}
	
	cout << mx<<'\n';
	
	
	
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
